# -*- coding: utf-8 -*-
# @Time    : 2024/6/24 16:44
# @Author  : yujiahao
# @File    : 07_pandas_drop_duplicates_str.py
# @description:Pandas去重、字符串


# todo 1、去重

'''
数据去重

“去重”通过字面意思不难理解，就是删除重复的数据。在一个数据集中，找出重复的数据并将其删除，最终只保存一个唯一存在的数据项，这就是数据去重的整个过程。

删除重复数据是数据分析中经常会遇到的一个问题。通过数据去重，不仅可以节省内存空间，提高写入性能，还可以提升数据集的精确度，使得数据集不受重复数据的影响。

Pandas DataFrame 对象提供了一个数据去重的函数 drop_duplicates()。

【方法签名】

    DataFrame.drop_duplicates(subset=None, keep='first', inplace=False, ignore_index=False)

【参数解释】

    - subset:
      - 用于指定考虑哪些列来识别重复项。如果未指定，所有列都会被考虑。

    - keep:
      - 这个参数决定了保留哪一个重复项。可以取以下值：
        - 'first': 保留第一次出现的重复项，删除后续的重复项（默认）。
        - 'last': 保留最后一次出现的重复项，删除之前的重复项。
        - False: 删除所有重复项，不保留任何重复项。

    - inplace:
      - 是否在原地修改 DataFrame。如果设置为 True，则会直接在原 DataFrame 上进行操作，而不会返回新的 DataFrame。

    - ignore_index:
      - 如果设置为 True，则返回的 DataFrame 会重新设置索引。
'''

import pandas as pd


def pandas_distinct():
    data = {

        'A': [1, 0, 1, 1],
        'B': [0, 2, 5, 0],
        'C': [4, 0, 4, 4],
        'D': [1, 0, 1, 1]
    }
    df = pd.DataFrame(data=data)
    print(df)

    print('''\n-----------------------------------☆☆☆分割线☆☆☆----------------------------------------\n''')

    # todo 1.1、默认保留第一次出现的重复项
    print(df.drop_duplicates())

    print('''\n-----------------------------------☆☆☆分割线☆☆☆----------------------------------------\n''')

    # todo 1.2、keep=False删除所有重复项
    print(df.drop_duplicates(keep=False))

    print('''\n-----------------------------------☆☆☆分割线☆☆☆----------------------------------------\n''')

    # todo 1.3、根据指定列标签去重

    # 去除所有重复项，对于B列来说两个0是重复项(也可以指定多列同时去重，写成列表就行)
    print(df.drop_duplicates(subset=['B'], keep=False))
    # 简写，省去subset参数
    # df.drop_duplicates(['B'],keep=False)

    print('''\n-----------------------------------☆☆☆分割线☆☆☆----------------------------------------\n''')

    # 如果去重之后需要重置索引，可以使用下面：
    print(df.reset_index(drop=True))



# todo 2、 Python Pandas处理字符串

    """
    常用的字符串处理函数如下表所示：
    
    函数名称            函数功能和描述
    ---------------------------------------
    lower()             将字符串转换为小写。
    upper()             将字符串转换为大写。
    len()               得出字符串的长度。
    strip()             去除字符串两边的空格（包含换行符）。
    split()             用指定的分割符分割字符串。
    cat(sep="")         用给定的分隔符连接字符串元素。
    get_dummies()       返回一个带有独热编码值的 DataFrame 结构。
    contains(pattern)   如果子字符串包含在元素中，则为每个元素返回一个布尔值 True，否则为 False。
    replace(a, b)       将值 a 替换为值 b。
    count(pattern)      返回每个字符串元素出现的次数。
    startswith(pattern) 如果 Series 中的元素以指定的字符串开头，则返回 True。
    endswith(pattern)   如果 Series 中的元素以指定的字符串结尾，则返回 True。
    findall(pattern)    以列表的形式返回出现的字符串。
    swapcase()          交换大小写。
    islower()           返回布尔值，检查 Series 中组成每个字符串的所有字符是否都为小写。
    isupper()           返回布尔值，检查 Series 中组成每个字符串的所有字符是否都为大写。
    isnumeric()         返回布尔值，检查 Series 中组成每个字符串的所有字符是否都为数字。
    repeat(value)       以指定的次数重复每个元素。
    find(pattern)       返回字符串第一次出现的索引位置。
    """



def pandas_str():
    # 示例 Series
    example_series = pd.Series(["Hello", "world", "HELLO", "WORLD", "123"])

    print("-----Series 操作-----")
    # lower() - 将字符串转换为小写
    print("lower():\n", example_series.str.lower())

    # upper() - 将字符串转换为大写
    print("upper():\n", example_series.str.upper())

    # len() - 得出字符串的长度
    print("len():\n", example_series.str.len())

    # strip() - 去除字符串两边的空格（包含换行符）
    print("strip():\n", example_series.str.strip())

    # split() - 用指定的分割符分割字符串
    print("split():\n", example_series.str.split())

    # replace(a, b) - 将值 a 替换为值 b
    print("replace('Hello', 'Hi'):\n", example_series.str.replace("Hello", "Hi"))

    # count(pattern) - 返回每个字符串元素出现的次数
    print("count('l'):\n", example_series.str.count("l"))

    # startswith(pattern) - 如果 Series 中的元素以指定的字符串开头，则返回 True
    print("startswith('H'):\n", example_series.str.startswith("H"))

    # endswith(pattern) - 如果 Series 中的元素以指定的字符串结尾，则返回 True
    print("endswith('d'):\n", example_series.str.endswith("d"))

    # find(pattern) - 返回字符串第一次出现的索引位置
    print("find('l'):\n", example_series.str.find("l"))

    # swapcase() - 交换大小写
    print("swapcase():\n", example_series.str.swapcase())

    # islower() - 返回布尔值，检查 Series 中组成每个字符串的所有字符是否都为小写
    print("islower():\n", example_series.str.islower())

    # isupper() - 返回布尔值，检查 Series 中组成每个字符串的所有字符是否都为大写
    print("isupper():\n", example_series.str.isupper())

    # isnumeric() - 返回布尔值，检查 Series 中组成每个字符串的所有字符是否都为数字
    print("isnumeric():\n", example_series.str.isnumeric())

    # repeat(value) - 以指定的次数重复每个元素
    print("repeat(2):\n", example_series.str.repeat(2))

    print("\n-----DataFrame 操作-----")
    # 示例 DataFrame
    data = {
        'A': ["Hello", "world", "HELLO", "WORLD", "123"],
        'B': ["foo", "bar", "baz", "qux", "quux"]
    }
    df = pd.DataFrame(data)

    print("原始 DataFrame:\n", df)

    # 对 DataFrame 的列 A 使用字符串函数
    print("\n对列 A 使用字符串函数:")

    # lower() - 将字符串转换为小写
    print("lower():\n", df['A'].str.lower())

    # upper() - 将字符串转换为大写
    print("upper():\n", df['A'].str.upper())

    # len() - 得出字符串的长度
    print("len():\n", df['A'].str.len())

    # strip() - 去除字符串两边的空格（包含换行符）
    print("strip():\n", df['A'].str.strip())

    # split() - 用指定的分割符分割字符串
    print("split():\n", df['A'].str.split())

    # replace(a, b) - 将值 a 替换为值 b
    print("replace('Hello', 'Hi'):\n", df['A'].str.replace("Hello", "Hi"))

    # count(pattern) - 返回每个字符串元素出现的次数
    print("count('l'):\n", df['A'].str.count("l"))

    # startswith(pattern) - 如果字符串以指定的字符串开头，则返回 True
    print("startswith('H'):\n", df['A'].str.startswith("H"))

    # endswith(pattern) - 如果字符串以指定的字符串结尾，则返回 True
    print("endswith('D'):\n", df['A'].str.endswith("D"))

    # find(pattern) - 返回字符串第一次出现的索引位置
    print("find('l'):\n", df['A'].str.find("l"))

    # swapcase() - 交换大小写
    print("swapcase():\n", df['A'].str.swapcase())

    # islower() - 返回布尔值，检查字符串中所有字符是否都为小写
    print("islower():\n", df['A'].str.islower())

    # isupper() - 返回布尔值，检查字符串中所有字符是否都为大写
    print("isupper():\n", df['A'].str.isupper())

    # isnumeric() - 返回布尔值，检查字符串中所有字符是否都为数字
    print("isnumeric():\n", df['A'].str.isnumeric())

    # repeat(value) - 以指定的次数重复字符串
    print("repeat(2):\n", df['A'].str.repeat(2))





def main():
    # pandas_distinct()
    pandas_str()

if __name__ == '__main__':
    main()
